import geoLocationManager from '@ohos.geoLocationManager';
import Logger from './Logger';

/**
 * 位置信息工具类。
 * 需要权限：ohos.permission.APPROXIMATELY_LOCATION
 *
 * API9之前的版本，申请ohos.permission.LOCATION即可。
 * API9及之后的版本，需要申请 ohos.permission.APPROXIMATELY_LOCATION 或者同时申请 ohos.permission.APPROXIMATELY_LOCATION 和 ohos.permission.LOCATION；无法单独申请 ohos.permission.LOCATION。
 *
 * 如果应用在后台运行时也需要访问设备位置，除需要将应用声明为允许后台运行外，还必须申请ohos.permission.LOCATION_IN_BACKGROUND权限，这样应用在切入后台之后，系统可以继续上报位置信息。
 */
class LocationUtil {
  /**
   * 开启位置变化订阅，并发起定位请求，使用 locationChange 回调函数接收数据。
   * @param locationChange 回调函数
   */
  geolocationOn(locationChange: (location: geoLocationManager.Location) => void): void {
    // 位置信息请求参数
    let requestInfo: geoLocationManager.LocationRequest = {
      'priority': 0x203, // 位置信息优先级设置，0x203表示快速获取位置优先。
      'scenario': 0x300, // 位置请求中定位场景设置，0x300表示未设置场景信息。
      'timeInterval': 0, // 表示上报位置信息的时间间隔，单位是秒。取值范围为大于0。
      'distanceInterval': 0, // 表示上报位置信息的距离间隔。单位是米，取值范围为大于0。
      'maxAccuracy': 0 // 表示精度信息。仅在精确位置功能场景下有效，模糊位置功能生效场景下该字段无意义。取值范围为大于0。
    }
    try {
      // 开启位置变化订阅，并发起定位请求。
      geoLocationManager.on('locationChange', requestInfo, locationChange);
    } catch (err) {
      Logger.error("locationChange error:" + JSON.stringify(err));
    }
  }

  /**
   * 关闭位置变化订阅，并删除对应的定位请求
   */
  geolocationOff(): void {
    try {
      //取消订阅事件 locationChange,第二个参数为回调函数，若无此参数，则取消当前类型的所有订阅。
      geoLocationManager.off('locationChange');
    } catch (err) {
      Logger.error("locationChange error:" + JSON.stringify(err));
    }
  }
}

let locationUtil = new LocationUtil();

export default locationUtil as LocationUtil;